package com.bm.common;

import com.bm.dao.CollegeDao;
import com.bm.util.FileUtil;
import com.bm.util.JdbcUtil;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Set;

/**
 * 工作室清洗工具
 */

public class StudioClean {

    /**
     * 清洗数据
     */
    public void cleanFile() {
        System.out.println("--开始学生数据清洗--");
        CollegeDao collegeDao = new CollegeDao();
        Set<String> majorNameSet = collegeDao.selectMajor();
        Set<String> collegeNameSet = collegeDao.selectCollege();
        majorNameSet.add("跨专业");

        ArrayList<String[]> list = FileUtil.CSV2Array("D:\\项目一数据\\数据\\脏数据\\工作室.csv");
        StringBuilder sb = new StringBuilder();//创建字符串拼接工具
        int row = 1;
        int col = 1;
        for (String[] line:list) {//循环每一行数据
            for (String word : line) {//循环每一行中的每个字段数据
                word = word.replaceAll("\\s","");//替换字符串中所有的空格
                if (word.length() == 0 ) {//判断字符串长度，0，数据缺失
                    sb.append(row).append("-").append(col).append(":数据缺失\n");//录数据缺失的行号
                }
                col++;//读取下个字段，列自增
            }

            String collegeName = line[0];
            if (!collegeNameSet.contains(collegeName)){
                sb.append(row).append(" - ").append(" : 学校名称不存在\n");
            }

            String majorName = line[3];
            if (!majorNameSet.contains(majorName)){
                sb.append(row).append(" - ").append(" : 专业名称不存在\n");
            }

            row++;//读取下个字段，hang自增
            col=1;//字段恢复到底一列
        }
        System.out.println(sb);//打印数据异常行号
    }

    /**
     * 根据传入字符串，获取工作室类型 ID
     * 专业工作室，ID=1，包含：专业、技能型
     * 企业合作工作室，ID=2，包含：校企合作型
     * 孵化工作室，ID=3，包含：大师、自主型
     *
     * @param word
     * @return
     */
    public String getStudioTypeID(String word) {
        //专业工作室，ID=1，包含：专业、技能型
        if ("专业".equals(word) || "技能".equals(word)) {
            return "1";
        }
        //企业合作工作室，ID=2，包含：校企合作型
        if ("校企合作".equals(word)) {
            return "2";
        }
        //孵化工作室，ID=3，包含：大师、自主型
        if ("自主".equals(word)) {
            return "3";
        }
        return "0";//都不匹配的，返回 0
    }

    /**
     *写入数据库
     */
    public void witeDB() {
        System.out.println("--开始学生数据写入--");

        Connection conn = null;//申明数据库连接对象
        Statement stmt = null;//申明数据库执行工具
        int row = 0;//数据库受影响行数

        StringBuilder sql = new StringBuilder();//申明SQL拼接工具
        sql.append("INSERT INTO `t_studio` VALUES");//INSERT语句的开头

        //读取清洗后的CSV文件，拼接成SQL批量插入语句
        ArrayList<String[]> list = FileUtil.CSV2Array("D:\\项目一数据\\数据\\脏数据\\工作室.csv");
        for (String[] line:list) {//循环每一行数据
            sql.append("(NULL,");//一行的开始
            for (int i = 0; i < line.length; i++) {
                String word = line[1].replaceAll("\\s", "");//替换字符串中所有的空格
                if (i == 3) {// 判断是专业名称字段
                    if ("跨专业".equals(word)) {// 如果专业名称是跨专业
                        sql.append("NULL").append(",");// 这只是 NULL 空
                        continue;// 开始下一次循环
                    }
                }
                sql.append("'").append(word).append("'").append(",");//拼接每个字段
                if (i == 2) {// 判断是工作室类型字段
                    word = getStudioTypeID(word);// 获取工作室类型 ID
                    sql.append(word).append(",");// 拼接工作室类型 ID
                }
            }
            sql.deleteCharAt(sql.length() - 1);//去掉最后一个字符，多余的逗号
            sql.append(") ,");//一行的结束
        }
        sql.deleteCharAt(sql.length()-1);//去掉最后一个字符，多余的逗号

        try {
            conn = JdbcUtil.getConnection();//获取数据库连接对象
            stmt = conn.createStatement();//获取执行SQL的工具
            row = stmt.executeUpdate(sql.toString());//执行拼接的SQL
            System.out.println("受影响行数"+row);//打印受影响行数（插入多少条数据）
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            JdbcUtil.release(conn,stmt);//回收资源
        }
    }
}
